﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GbmpCommon.h"
#include "GcmpGraphicsNodeInterface.h"

namespace gcmp
{
    /// \brief 图形节点标识符
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT GraphicsNodeId
    {
        typedef std::true_type clone_as_value;
    public:
        DEFINE_VISUAL_TYPE_INT32(IntBaseType::Dec)
        

        /// \brief 通过整型值创建图形节点标识符
        /// \param id 整型值
        /// \return 图形节点标识符
        static GraphicsNodeId Create(Int32 id) { return GraphicsNodeId(id); }

    public:
        /// \brief 通过整型值创建图形节点标识符的构造器
        /// \param id 整型值。默认值为-1，表示未被标志。
        explicit GraphicsNodeId(Int32 id=-1) : m_id(id) {}

        /// \brief 获取标识符是否合法
        /// \return true-合法；false-不合法
        bool IsValid() const{return m_id != -1;}

        /// \brief 获取是否与目标对象相等
        /// \param id 目标对象
        /// \return true-相等；false-不相等
        bool operator==(const GraphicsNodeId& id) const {return m_id == id.m_id;}

        /// \brief 获取是否与目标对象不相等
        /// \param id 目标对象
        /// \return true-不相等；false-相等
        bool operator!=(const GraphicsNodeId& id)const {return !(*this==id);}

        /// \brief 获取是否小于目标对象
        /// \param id 目标对象
        /// \return true-小于；false-不小于
        bool operator<(const GraphicsNodeId& id)const {return m_id < id.m_id;}

        /// \brief 获取标识符的整型值
        /// \return 标识符的整型值
        int32_t AsInt() const {return m_id;}

        /// \brief 获取标识符的整型值
        /// \return 标识符的整型值
        operator Int32 () const { return m_id; }

        /// \brief 静态成员，默认为非法标识符
        static GraphicsNodeId InvalidId;

    private:
        Int32 m_id;
    };

    /// \brief 特殊处理，GraphicsNodeId不是Foundation的，为了在序列化、反序列化、Dump的时候处理它，将它的类型记为其实现类型：int32_t.
    template <>
    struct TypeDefTrait<GraphicsNodeId>
    {
        static const wchar_t* RealName(const wchar_t* /*alias*/)
        {
            return L"int32_t";
        }
    };
}

